package co.edu.uniquindio.ondas.negocio;

import java.util.List;

import co.edu.uniquindio.ondas.dtos.ResumenConsultaDTO;
import co.edu.uniquindio.ondas.dtos.ResumenEvaluacionSeleccionDTO;
import co.edu.uniquindio.ondas.dtos.ResumenHistorialAsesorDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInstitucionDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionAsesorDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionDTO;
import co.edu.uniquindio.ondas.entidades.Asesor;
import co.edu.uniquindio.ondas.entidades.Bitacora1Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora2;
import co.edu.uniquindio.ondas.entidades.Bitacora2Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora3;
import co.edu.uniquindio.ondas.entidades.Bitacora3Maestro;
import co.edu.uniquindio.ondas.entidades.Convocatoria;
import co.edu.uniquindio.ondas.entidades.Estudiante;
import co.edu.uniquindio.ondas.entidades.Evaluador;
import co.edu.uniquindio.ondas.entidades.Institucion;
import co.edu.uniquindio.ondas.entidades.Maestro;
import co.edu.uniquindio.ondas.entidades.Municipio;
import co.edu.uniquindio.ondas.entidades.RespuestaConsulta;
import co.edu.uniquindio.ondas.entidades.Sede;

/**
 * @author Javier
 *Interface que define los mentodos para el EJB AdministradorEJB.
 *permite realizar las operaciones del Administrador
 */
public interface AdministradorEJBInterface {
	
	/**
	 * Metodo que sirve para iniciar la cuenta del perfil administrador
	 * @param identificacion
	 * @param clave
	 *  @return operador logico
	 */
	public boolean inicioSesion(String identificacion, String clave);
	/**
	 * 	Metodo que permite crear un nuevo Municipio en el sistema
	 * @param municipio
	 *  @return operador logico
	 */
	public boolean crearMunicipio(Municipio municipio);
	/**
	 * Metodo que permite crear un nuevo Asesor en el  sistema
	 * @param asesor
	 * @param linea
	 *  @return operador logico
	 */
	public boolean crearAsesor(Asesor asesor, String linea);
	/**
	 * Metodo que permite crear un nuevo Evaluador en el sistema
	 * @param nuevoEvaluador
	 * @param linea
	 * @return operador logico
	 */
	public boolean crearEvaluador(Evaluador nuevoEvaluador, String linea);
	/**
	 * Meotodo que permite obtener una lista de los Municipios registrados en el sistema
	 * @return Lista de municipios
	 */
	public List<String> getListaMunicipios();
	/**
	 * Meotodo que permite obtener una lista de los nombres de Instituciones registrados en el sistema
	 * @return Lista de los nombres de Instituciones
	 */
	public List<String> getListaInstituciones();
	/**
	 * Meotodo que permite obtener una lista de las  Zonas registrados en el sistema
	 * @return Lista de Zonas
	 */
	public List<String> getListaZonas();
	/**
	 * Meotodo que permite obtener una lista de las Instituciones registrados en el sistema
	 * @return Lista de Instituciones
	 */
	public List<Institucion>getInstituciones();
	/**
	 * Metodo que obtiene una lista de los nombre de instituciones por nombre del municipio y por nombre de zona
	 * @param municipio
	 * @param zona
	 * @return Lista de nombre de instituciones
	 */
	public List<String> getListaNombresInstituciones(String municipio, String zona);
	/**
	 * Metodo que permite obtener una lista de las Sedes registradas en el sistema
	 * @return  Lista de Sedes
	 */
	public List<Sede>getSedes();
	/**
	 * Meotodo que permite obtener una lista de los nombres de las Sedes registradas en el sistema
	 * @return Lista de nombre de Sedes
	 */
	public List<String>obtenerListaSedes();
	
	/**
	 * Metodo que permite obtener informacion de una institucion por medio de una consulta paginada para editarla
	 * @param tamPagina
	 * @param municipio
	 * @param nombre
	 * @param zona
	 * @return total de paginas
	 */
	public long obtenerTotalPaginasIntituciones(int tamPagina, String municipio, String nombre, String zona);
	
	/**
	 * 
	 * @param numPag
	 * @param tamanoPag
	 * @param municipio
	 * @param nombre
	 * @param zona
	 * @return Lista de instituciones paginadas
	 */
	public List<Institucion>obtenerPaginaIntituciones(int numPag, int tamanoPag, String municipio, String nombre, String zona);
	
	/**
	 * Metodo que permite retornar el total de paginas de las Sedes 
	 * @param tamPagina
	 * @param municipio
	 * @param institucion
	 * @param sede
	 * @param zona
	 * @return Total de paginas
	 */
	public long obtenerTotalPaginasSedes(int tamPagina, String municipio,	String institucion, String sede, String zona);
	
	/**
	 * Metodo que permite obtener una lista de Sedes para su edicion
	 * @param numPag
	 * @param tamanoPag
	 * @param municipio
	 * @param institucion
	 * @param sede
	 * @param zona
	 * @return Lista de sedes
	 */
	public List<Sede>obtenerPaginaSedes(int numPag, int tamanoPag, String municipio, String institucion, String sede, String zona);
	
	/**
	 * Meotodo que permite crear una Institucion
	 * @param institucion
	 * @param nombreMunicipio
	 * @param nombreZona
	 * @return operador logico (indica el registro o no registro)
	 */
	public boolean crearIntitucion(Institucion institucion , String nombreMunicipio, String nombreZona);
	
	/**
	 * Metodo que permite obtener una lista de sedes por nombre del municion, institucion y zona
	 * @param municipio
	 * @param institucion
	 * @param zona
	 * @return lista de sedes
	 */
	public List<String> obtenerListaSedesInstitucion(String municipio, String institucion, String zona);
	
	/**
	 * Metodo que permite registrar una nueva sede en el sistema
	 * @param sede
	 * @param nombreInstitucion
	 * @param nombreMunicipio
	 * @return operador logico (indica el registro o no registro)
	 */
	public boolean crearSede(Sede sede, String nombreInstitucion, String nombreMunicipio);
	
	/**
	 * Metodo que permite actualizar una institucion  por Institucion, nombre del municipio y el de la zona
	 * @param institucion
	 * @param nombreMunicipio
	 * @param nombreZona
	 * @return operador logico (indica el registro o no registro)
	 */
	public boolean editarIntitucion(Institucion institucion, String nombreMunicipio, String nombreZona);
	
	/**
	 * Metodo que permite actualizar una sede por la Sede, el nombre de la institucion y el nombre del municipio
	 * @param sede
	 * @param institucion
	 * @param nombreMunicipio
	 * @return operador logico (indica el registro o no registro)
	 */
	public boolean editarSede(Sede sede, String institucion, String nombreMunicipio);
	
	/**
	 * Metodo que permite obtener una lista de Asesores registrados en el sistema
	 * @return listado de Asesores 
	 */
	public List<Asesor> getListaAsesores();
	
	/**
	 * Metodo que permite obtener una lista del Resumen de una Investigacion
	 * @param idAsesor
	 * @return lista de Investigaciones 
	 */
	public List<ResumenInvestigacionAsesorDTO> getResumenInvestigacion(String idAsesor);
	
	/**
	 * Metodo que permite eliminar de la investigacion un Asesor
	 * @param inv
	 * @return operador logico (indica el registro o no registro)
	 */
	public boolean eliminarInvestigacionAsesor(ResumenInvestigacionAsesorDTO inv);
	
	/**
	 * Metodo que permite obtener del sistema una lista de las investigaciones a evaluar
	 * @return lista de investigaciones a evaluar
	 */
	public List<ResumenInvestigacionDTO> getlistaInvestigacionEvaluar();
	
	/**
	 * Metodo que permite obtener un Bitacora2 por medio de su llave primaria
	 * @param idInvestigacion
	 * @return Bitacora2
	 */
	public Bitacora2 getBitacora2(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener un Bitacora3 por medio de su llave primaria
	 * @param idInvestigacion
	 * @return Bitacora3
	 */
	public Bitacora3 getBitacora3(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener un Bitacora1Maestro por medio de su llave primaria
	 * @param idInvestigacion
	 * @return Bitacora1Maestro
	 */
	public Bitacora1Maestro getBitacora1Maestro(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener un Bitacora2Maestro por medio de su llave primaria
	 * @param idInvestigacion
	 * @return Bitacora2Maestro
	 */
	public Bitacora2Maestro getBitacora2Maestro(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener un Bitacora3Maestro por medio de su llave primaria
	 * @param idInvestigacion
	 * @return Bitacora3Maestro
	 */
	public Bitacora3Maestro getBitacora3Maestro(long idInvestigacion);
	
	/**
	 * Metodoq que permite obtener una lista de los evaluadores registrados en el sistema por medio de su identificador
	 * @param idLinea
	 * @return lista de evaluadores
	 */
	public List<Evaluador> obtenerListaEvaluador(long idLinea);
	
	/**
	 * Metodo que permite asignar un evaluador a una investigacion
	 * @param idInvestigacion
	 * @param idEvaluador
	 * @return  operador logico (indica el registro o no registro)
	 */
	public boolean asignarEvaluador(long idInvestigacion, String idEvaluador);
	
	/**
	 * Metodo que permite obtener un listado de las evaluaciones a seleccionar 
	 * @return Lista de evaluaciones seleccionadas
	 */
	public List<ResumenEvaluacionSeleccionDTO> obtenerListaEvaluacionSeleccion();
	
	/**
	 * Metodo que permite obtener una lista de lineas tematicas registradas en el sistema
	 * @return listado de lineas tematicas
	 */
	public List<String> obtenerListaLineas();
	
	/**
	 * Metodo que permite financiar una investigacion  por medio de su identificador
	 * @param idInvestigacion
	 * @return operador logico (indica patrocinio no patrocinio)
	 */
	public boolean patrocinarInvestigacion(long idInvestigacion);
	
	/**
	 * Metodo que permite una lista de las investigaciones dispuestas a ser asignadas a un Asesor
	 * @return listado de Investigaciones 
	 */
	public List<ResumenInvestigacionDTO> obtenerInvestigacionAsignarAsesor();
	
	/**
	 * Metodo que permite obtener del sistema los Asesores registrado
	 * @param idLinea
	 * @return lista de Asesores
	 */
	public List<Asesor> obtenerAsesoresLinea(long idLinea);
	
	/**
	 * Metodo que permite asignar un Asesor a una Investigacion
	 * @param asesor
	 * @param idInvestigacion
	 * @return operador logico (indica asignado o no asignado)
	 */
	public boolean asignarAsesorInvestigacion(Asesor asesor, long idInvestigacion);
	
	/**
	 * Metodo que permite obtener la consultas hechas a un Administrador
	 * @return lista de consultas administrador
	 */
	public List<ResumenConsultaDTO> obtenerConsultasAdministrador();
	
	/**
	 * Metodo que permite crea una nueva consulta en el sistema
	 * @param respuesta
	 * @param idConsulta
	 * @return operador logico (indicar creado o no creado)
	 */
	public boolean crearRespuestaConsulta(RespuestaConsulta respuesta, long idConsulta);
	
	/**
	 * Metodo que permite obtener el total de paginas de una investigacion
	 * @param tamPag
	 * @param seleccionado
	 * @param activo
	 * @param municipio
	 * @param institucion
	 * @param zona
	 * @param sede
	 * @return total de paginas
	 */
	public Long obtenerTotalPaginasInvestigaciones(int tamPag, String seleccionado, String activo, String municipio, String institucion, String zona, String sede);
	
	/**
	 * Metodo que permite obtener una lista de paginas de la investigacion
	 * @param numPag
	 * @param tamanoPag
	 * @param seleccionado
	 * @param activo
	 * @param municipio
	 * @param institucion
	 * @param zona
	 * @param sede
	 * @return lista de paginas Investigacion
	 */
	public List<ResumenInvestigacionDTO> obtenerPaginaInvestigacion(int numPag, int tamanoPag, String seleccionado, String activo, String municipio, String institucion, String zona, String sede);
	
	/**
	 * Metodo que permite obtener una lista de estudiantes por Grupo registrados en el sistema
	 * @param idInvestigacion
	 * @return listado de estudiantes por grupo
	 */
	public List<Estudiante> obtenerEstudiantesGrupo(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener una de Maestros por grupo registrados en el sistema 
	 * @param idInvestigacion
	 * @return lista de Maestros por Grupo
	 */
	public List<Maestro> obtenerMaestrosGrupo(long idInvestigacion);
	
	/**
	 * Metodo que permite obtener un listado de resumenes de sedes
	 * @return listado de resumen de sedes
	 */
	public List<ResumenInstitucionDTO> obtenerResumenSedes();
	
	/**
	 * Metodo que permite obtener una lista de los asesores que tienen asignado una investigacion registrados en el sistema
	 * @return listado de Asesores con invenstigacion
	 */
	public List<Asesor> obtenerAsesoresConInvestigaciones();
	
	/**
	 * Metodo que permite obtener el historial de un Asesor 
	 * @param idAsesor
	 * @return listado del historial Asesor
	 */
	public List<ResumenHistorialAsesorDTO> obtenerHistorialAsesor(String idAsesor);
	
	/**
	 * Metodo que permite registrar una convocatoria en el sistema
	 * @param convocatoria
	 * @return operador logico (Indicar creado o no creado)
	 */
	public boolean crearConvocatoria(Convocatoria convocatoria);
	
	/**
	 * Metodo que permite editar una convocatoria registrada en el sistema
	 * @param convocatoria
	 * @param estado
	 * @return operador logico  (indica editada o no editada)
	 */
	public boolean editarConvocatoria(Convocatoria convocatoria, String estado);
	
	/**
	 * Metodo que permite eliminar una convocatoria registrada en el sistema
	 * @param convocatoria
	 * @return operador logico (indica eliminada no eliminada)
	 */
	public boolean eliminarConvocatoria(Convocatoria convocatoria);
	
	public List<Convocatoria> obtenerConvocatorias();
	
	public boolean eliminarAsesor(Asesor asesor);
}
